from sqlalchemy import Column, Integer, String, DateTime, JSON, Text, ForeignKey
from sqlalchemy.orm import relationship
from datetime import datetime

# 直接使用绝对导入，避免相对导入问题
from db.models.base import Base


class ScanTask(Base):
    __tablename__ = "scan_tasks"  # 数据库表名
    __table_args__ = {'extend_existing': True}  # 允许扩展已有表（用于迁移）

    # 表字段定义
    id = Column(Integer, primary_key=True, autoincrement=True, index=True)  # 主键，整数类型，自增，建立索引
    repo_url = Column(String(255), nullable=False)  # 代码仓库URL，字符串，不允许为空
    branch = Column(String(100), nullable=False)  # 代码分支，字符串，不允许为空
    scan_type = Column(String(50), server_default='all', nullable=False)  # 扫描类型，默认值为'all'
    status = Column(String(50), nullable=False)  # 任务状态，字符串，不允许为空
    created_at = Column(DateTime, default=datetime.utcnow)  # 创建时间，默认值为当前UTC时间
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)  # 更新时间，自动更新

    # 关系映射：一个任务对应多个结果
    results = relationship('ScanResult', back_populates='task')
    # 关系映射：一个任务对应多个AI分析结果
    ai_analysis_results = relationship('AIAnalysisResult', back_populates='task')


class ScanResult(Base):
    __tablename__ = 'scan_results'  # 数据库表名
    __table_args__ = {'extend_existing': True}  # 允许扩展已有表

    # 表字段定义
    id = Column(Integer, primary_key=True, autoincrement=True, index=True)  # 主键
    task_id = Column(Integer, ForeignKey('scan_tasks.id'))  # 外键，关联ScanTask的id
    file_path = Column(String(255), nullable=False)  # 文件路径，不允许为空
    function_name = Column(String(255), nullable=False)  # 函数名，不允许为空
    start_line = Column(Integer, nullable=False)  # 问题起始行号
    end_line = Column(Integer, nullable=False)  # 问题结束行号
    line_number = Column(String(255), nullable=False)  # 问题行号
    code_snippet = Column(Text, nullable=False)  # 代码片段
    issue_type = Column(String(50), nullable=False)  # 问题类型（如漏洞、代码异味等）
    severity = Column(String(50), nullable=False)  # 严重级别（低/中/高/紧急）
    message = Column(Text, nullable=False)  # 问题描述，文本类型
    suggestion = Column(Text, nullable=True)  # 修复建议，可为空
    created_at = Column(DateTime, default=datetime.utcnow)  # 创建时间

    # 关系映射：反向关联ScanTask
    task = relationship('ScanTask', back_populates='results')


class ScanRecord(Base):
    """扫描记录表"""
    __tablename__ = 'scan_records'
    __table_args__ = {'extend_existing': True}

    id = Column(Integer, primary_key=True, autoincrement=True, index=True)
    scan_id = Column(Integer, nullable=False)  # 关联的扫描任务ID
    scan_type = Column(String(50), nullable=False)  # 扫描类型
    status = Column(String(50), nullable=False)  # 扫描状态
    start_time = Column(DateTime, nullable=False)  # 开始时间
    end_time = Column(DateTime, nullable=True)  # 结束时间
    total_files = Column(Integer, default=0)  # 总文件数
    scanned_files = Column(Integer, default=0)  # 已扫描文件数
    total_issues = Column(Integer, default=0)  # 发现的问题总数
    scan_config = Column(JSON, nullable=True)  # 扫描配置
    created_at = Column(DateTime, default=datetime.utcnow)  # 创建时间
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)  # 更新时间


class AIAnalysisResult(Base):
    """AI分析结果表"""
    __tablename__ = 'ai_analysis_results'
    __table_args__ = {'extend_existing': True}

    id = Column(Integer, primary_key=True, autoincrement=True, index=True)
    task_id = Column(Integer, ForeignKey('scan_tasks.id'), nullable=False)  # 外键，关联ScanTask的id
    file_path = Column(String(255), nullable=False)  # 文件路径
    function_name = Column(String(255), nullable=False)  # 函数名
    start_line = Column(Integer, nullable=False)  # 起始行号
    end_line = Column(Integer, nullable=False)  # 结束行号
    analysis_content = Column(Text, nullable=False)  # 分析内容
    created_at = Column(DateTime, default=datetime.utcnow)  # 创建时间

    # 关系映射：反向关联ScanTask
    task = relationship('ScanTask', back_populates='ai_analysis_results')
